Cloudflare Workers
Cloudflareのエッジネットワーク上で動くサーバーレスコンピューティングプラットフォーム
JSのランタイムでもある
V8エンジン上で動作し、コールドスタートが0ms
website
参考
/mrsekut-book-9784297154387/012: 第1章 はじめてのCloudflare Workers
Cloudflare Workers それは Frontend / Node.js が CDN Edge Side まで拡張されるもの
読んだ感じかなり良さそうmrsekut.icon
Cloudflare公式のdocsも多く引用されているので、docsを眺める時の補助にもなりそう
#WIP
Claude Code.icon
基本構造
code:ts
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
return new Response("Hello World!");
},
};
3つの引数
table:_
引数 説明
request 受信したHTTPリクエスト(Web標準の Request)
env バインディング(KV, D1, R2, Queues, 環境変数等)
ctx 実行コンテキスト(waitUntil, passThroughOnException)
プロジェクト作成と開発
code:bash
# 新規作成
npm create cloudflare@latest my-worker
# ローカル開発
wrangler dev
# デプロイ
wrangler deploy
ExecutionContext
code:ts
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext) {
// レスポンス返却後もバックグラウンドで処理を続ける
ctx.waitUntil(
env.MY_QUEUE.send({ url: request.url })
);
// 例外発生時にオリジンにフォールスルー
ctx.passThroughOnException();
return new Response("OK");
},
};
table:_
メソッド 説明
ctx.waitUntil(promise) レスポンス返却後にPromiseの完了を待つ。ログ送信やキューイングに使う
ctx.passThroughOnException() Worker内で例外が発生した場合、オリジンサーバーにリクエストを転送する
イベントハンドラ
fetch 以外にも複数のイベントハンドラがある:
code:ts
export default {
// HTTPリクエスト
async fetch(request, env, ctx) { ... },
// Cron Trigger(定期実行)
async scheduled(event, env, ctx) { ... },
// Queue コンシューマー
async queue(batch, env, ctx) { ... },
// メール受信
async email(message, env, ctx) { ... },
// Tail Worker(ログ受信)
async tail(events) { ... },
};
Cron Triggers
Fetch API(外部リクエスト)
Worker内から外部APIを呼び出す:
code:ts
const response = await fetch("https://api.example.com/data", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ key: "value" }),
});
const data = await response.json();
サブリクエストの制限
table:_
プラン 制限
Free 50リクエスト/実行
Paid 1,000リクエスト/実行(Unbound: 無制限)
バインディング一覧
code:toml
# 環境変数
vars
API_KEY = "xxx"
# KV
kv_namespaces
binding = "KV"
id = "xxx"
# D1
d1_databases
binding = "DB"
database_name = "my-db"
database_id = "xxx"
# R2
r2_buckets
binding = "BUCKET"
bucket_name = "my-bucket"
# Queue
queues.producers
queue = "my-queue"
binding = "QUEUE"
# Service Binding(他のWorkerを呼ぶ)
services
binding = "AUTH_SERVICE"
service = "auth-worker"
# AI
ai
binding = "AI"
# Vectorize
vectorize
binding = "VECTOR_INDEX"
index_name = "my-index"
# Hyperdrive(外部DBプロキシ)
hyperdrive
binding = "HYPERDRIVE"
id = "xxx"
Service Bindings
Static Assets(静的ファイル配信)
code:toml
# wrangler.toml
assets = { directory = "./public" }
./public 内のファイルがそのまま配信される。Workerロジックと組み合わせ可能。
Web Standards API
Workers内で使えるWeb標準API:
table:_
API 説明
fetch() HTTPリクエスト
Request / Response HTTP関連
URL / URLSearchParams URL解析
Headers ヘッダー操作
TextEncoder / TextDecoder テキスト変換
crypto Web Crypto API
atob() / btoa() Base64
setTimeout() / setInterval() タイマー(制限あり)
ReadableStream / WritableStream ストリーム
structuredClone() ディープコピー
navigator.userAgent "Cloudflare-Workers"
AbortController リクエストキャンセル
WebSocket WebSocket接続
HTMLRewriter HTMLの書き換え(Cloudflare独自)
HTMLRewriter
制限事項
table:_
項目 Free Paid (Bundled) Paid (Unbound)
リクエスト数 10万/日 1,000万/月含む 100万/月含む
CPU時間/実行 10ms 50ms 30s
メモリ 128MB 128MB 128MB
Workerサイズ 1MB 10MB 10MB
環境変数 64個 128個 128個
Cron Triggers 3個 5個 5個
サブリクエスト 50 50 1,000
料金
table:_
プラン 料金
Free $0(10万リクエスト/日)
Paid (Standard) $5/月 + 1,000万リクエスト超過分 $0.30/100万
CPU時間超過 $0.02/100万ms
起動速度が速い
価格が安い
DXが良い
Node.jsに依存するlibraryは使えない
https://zenn.dev/devneko/articles/3b47c933b11e85
https://www.fastly.com/jp/blog/debunking-cloudflares-recent-performance-tests
https://yusukebe.com/posts/2021/cloudflare/
ServiceWorkerのAPIがCDN Edge上で動くJavaScript 処理系
https://zenn.dev/catnose99/articles/dfc9c1197daec3
Cloudflare Workersの内部実装
https://yusukebe.com/posts/2021/cloudflare-workers/